package com.yuri.news.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import com.yuri.news.entity.Role;
import com.yuri.news.entity.User;
import com.yuri.news.jpa.RoleRepository;
import com.yuri.news.jpa.UserRepository;
import com.yuri.news.service.UserService;

@Service
public class UserServiceImpl implements UserService {
	@Autowired
	UserRepository userRepository;
	@Autowired
	RoleRepository roleRepository;
	/**
	 * 根据用户名和密码查询用户
	 * @param userName	登录名
	 * @param userPw	登录密码
	 * @return	查询到的用户
	 */
	@Override
	public User findByUserNameAndPw(String userName, String userPw) {
		return userRepository.findByUserNameAndUserPw(userName, userPw);
	}
	/**
	 * 根据id查询用户信息
	 * @param id
	 * @return  查询到的用户信息无结果返回null
	 */
	@Override
	public User findUserById(Long id) {
		Optional<User> optional = userRepository.findById(id);
		
		if(optional.isPresent()) {
			return optional.get();
		}else {
			return null;
		}
	}
	/**
	 * 添加用户
	 * @param user
	 * @return	成功返回true 失败返回false
	 */
	@Override
	public Boolean addUser(User user, String roleId) {
		Boolean flag = false;
		List<Role> roles = new ArrayList<>();
		
		User use = userRepository.findByUserName(user.getUserName());
		
		if(use == null) {
			// 设置角色  如果选择了角色  则添加此角色   如果没有就添加默认角色
			if (null != roleId && !"".equals(roleId))
				// 添加角色
				roles.add(roleRepository.findById(new Long(roleId)).get());
			else
				// 设置为默认角色
				roles.add(roleRepository.findByRoleName("普通用户").get(0));
			// 设置部门
			if(null != user.getDepa() && -1 == user.getDepa().getId()) {
				user.setDepa(null);
			}
			user.setRole(roles);
			user.setIsAvailable(true);
			
			User us = userRepository.save(user);
			if (null != us) {
				flag = true;
			}
		}
		return flag;
	}
	/**
	 * 设置可用状态
	 * @param isAva
	 * @return  成功返回true 失败返回false(返回false说明不存在)
	 */
	@Override
	public Boolean setAvailable(Long id){
		Boolean flag = false;
		// 查询是否存在此用户
		Optional<User> optional = userRepository.findById(id);
		// 如果存在则进行更新
		if(optional.isPresent()) {
			User user = optional.get();
			if (user.getIsAvailable())
				user.setIsAvailable(false);
			else
				user.setIsAvailable(true);

			userRepository.save(user);
			
			flag = true;
		}
		return flag;
	}
	/**
	 * 更新用户信息
	 * @param user	
	 * @return	成功返回true 失败返回false
	 */
	@Override
	public Boolean updateUser(User user) {
		Boolean flag = false;
		// 查询是否有此用户
		Optional<User> optional = userRepository.findById(user.getId());
		// 如果有则进行更改
		if(optional.isPresent()) {
			// 判断选择的部门信息  如果部门id为-1 则说明  部门为空
			if(null != user.getDepa() && -1 == user.getDepa().getId()) {
				user.setDepa(null);
			}
			User ur = optional.get();
			ur.setDepa(user.getDepa());
			userRepository.save(ur);
			
			flag = true;
		}
		return flag;
	}
	/**
	 * 给用户添加角色
	 * @param userId	用户id
	 * @param roleId	角色id
	 * @return		成功返回true 失败返回false 失败无此用户
	 */
	@Override
	public Boolean userAddRole(Long userId, Long roleId) {
		Boolean flag = false;
		// 查询是否存在
		Optional<User> optional = userRepository.findById(userId);
		// 如果存在
		if (optional.isPresent()) {
			roleRepository.updateRoleUser(userId, roleId);
			flag = true;
		}
		
		return flag;
	}
	/**
	 * 删除用户角色
	 * @param userId	用户id
	 * @param roleId	角色id
	 * @return	成功返回true 失败返回false(不存在此用户)
	 */
	@Override
	public Boolean delRole(Long userId, Long roleId) {
		Boolean flag = false;
		Optional<User> optional = userRepository.findById(userId);
		if(optional.isPresent()) {
			roleRepository.deleteRoleUser(userId, roleId);
			flag = true;
		}
		return flag;
	}
	/**
	 * 分页查询所有用户
	 * @param page	分页信息
	 * @return	查询到的用户
	 */
	@Override
	public Page<User> findUserAll(Pageable page, Boolean isAva) {
		return userRepository.findByIsAvailable(page, isAva);
	}
	/**
	 * 关键字查询（key不为数字时）
	 * @param key	关键字
	 * @param isAva	是否可用
	 * @param page	分页信息
	 * @return	查询到的用户信息(无结果返回null)
	 */
	@Override
	public Page<User> findUserByKey(String key, Boolean isAva, Pageable page) {
		// 存放查询到的用户数据
		Page<User> users = null;
		
		// key为空时,查询所有
		if ("".equals(key)) {
			return findUserAll(page, isAva);
		} else if (userRepository.findByDepaName(key, isAva).size() > 0) { // 如果为部门
			users = userRepository.findByDepaName(key, isAva, page);

		} else if (userRepository.findByRoleName(key, isAva).size() > 0) {	// 如果为角色
			users = userRepository.findByRoleName(key, isAva, page);

		} else {		// 如果为登录名
			users = userRepository.findByUserNameLikeAndIsAvailable(page, "%"+key+"%", isAva);
		}
		
		if(users != null && users.getContent() != null && users.getContent().size() > 0) {
			return users;
		}else {
			return null;
		}
	}
	@Override
	public List<User> findUserByRoleName(String roleName, Boolean isAva) {
		return userRepository.findByRoleName(roleName, isAva);
	}
	@Override
	public List<User> findUserByDepaName(String depaName, Boolean isAva) {
		return userRepository.findByDepaName(depaName, isAva);
	}

}
